home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / lboss02w.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  5KB  |  216 lines

  1. /* 2面ボス左右翼 (02w = 02 wing) */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12.  
  13.  
  14. #define SPEED_SHOT1    12    /* 1段階目扇型ショット速度 */
  15. #define SPEED_SHOT2    10    /* 2段階目伸びるショットの一番遅い弾の速度 */
  16.  
  17.  
  18. enum {
  19.     WING_LEFT = 0, WING_RIGHT
  20. };
  21.  
  22. enum {
  23.     ATTACK_UPPER_CORE = 0,    /* 上のコアから攻撃(伸びる弾) */
  24.     ATTACK_LOWER_CORE    /* 下のコアから攻撃(ばらまき弾) */
  25. };
  26.  
  27. static short EnemyMoveLBoss02W (ENEMY *);
  28. static void EnemyTiniLBoss02W (ENEMY *);
  29.  
  30.  
  31. void EnemyInitLBoss02W (ENEMY * p)
  32. {
  33.     /* 攻撃する回数(復活する後とに回数が増える) */
  34.     short shot_num_table[8] =
  35.     {3, 4, 5, 6, 8, 10, 12, 14};
  36.  
  37.     p->vx = 0;
  38.     p->vy = 2 << 16;
  39.     p->hit_px = 24;
  40.     p->hit_py = 16;
  41.     p->hit_sx = 24;
  42.     p->hit_sy = 16;
  43.     p->hit_cx = 6;
  44.     p->timer = 0;
  45.     p->damage = 0;
  46.     p->flash = 0;
  47.     p->seq = 0;
  48.     p->m_work = 0;
  49.     p->s_work = 0;
  50.     p->func_enemy_move = EnemyMoveLBoss02W;
  51.     p->func_enemy_tini = EnemyTiniLBoss02W;
  52.  
  53.     if (p->lx < 0) {
  54.         p->cwork = WING_LEFT;    /* 左か右か */
  55.         p->cwork2 = p->ly;    /* 難易度(何回復活したか・ly を流用) */
  56.         p->pt = obj_lboss02 + 5;
  57.         p->hp = 300;
  58.     } else {
  59.         p->cwork = WING_RIGHT;
  60.         p->cwork2 = p->ly;
  61.         p->pt = obj_lboss02 + 6;
  62.         p->hp = 250;    /* 実は右の方がちょっと弱い */
  63.     }
  64.     if (p->arg > 8)
  65.         p->arg = 8;
  66.     p->s_work3 = 0;
  67.     p->s_work4 = shot_num_table[p->arg];
  68. }
  69.  
  70.  
  71.  
  72. static short EnemyMoveLBoss02W (ENEMY * p)
  73. {
  74.     signed short offset[14][2] =    /* 翼パーツの座標オフセット */
  75.     {
  76.         {-44, -25},
  77.         {-47, -22},
  78.         {-54, -17},
  79.         {-62, -12},
  80.         {-69, -7},
  81.         {-76, -2},
  82.         {-80, 0},
  83.         {-86, 4},
  84.         {-74, -3},
  85.         {-78, -1},
  86.         {-86, 4},
  87.         {-75, -2},
  88.         {-80, 0},
  89.         {-80, 0}
  90.     };
  91.  
  92.     if ((p->child_kill) || (p->child_death))
  93.         return (-1);    /* 消去 */
  94.  
  95.     switch (p->seq) {
  96.     case 0:
  97.         if (p->m_work < 12) {
  98.             if (p->cwork == WING_LEFT)
  99.                 p->x = p->parent->x + offset[p->m_work][0];
  100.             else
  101.                 p->x = p->parent->x - offset[p->m_work][0];
  102.             p->y = p->parent->y + offset[p->m_work][1];
  103.         }
  104.         if (p->m_work == 7)
  105.             SoundSetSE (SE_LOCK_M);    /* 「がちゃん」という効果音を鳴らす */
  106.         if (p->m_work == 12)
  107.             p->seq++;
  108.         p->m_work++;
  109.         break;
  110.     case 1:
  111.         if (p->cwork == WING_LEFT)
  112.             p->x = p->parent->x - 80;
  113.         else
  114.             p->x = p->parent->x + 80;
  115.         p->y = p->parent->y;
  116.  
  117.         /* 次に攻撃処理 */
  118.         p->s_work++;
  119.         if (p->s_work == 1) {
  120.             if (p->cwork == WING_LEFT)
  121.                 p->s_angle = 16;
  122.             else
  123.                 p->s_angle = 128 - 16;
  124.             p->s_work2 = 0;
  125.         }
  126.         p->s_work2++;
  127.         if (p->s_work2 > 8) {
  128.             p->s_work2 = 0;
  129.             if (p->s_work3++ < p->s_work4) {
  130.                 if (p->cwork == WING_LEFT) {
  131.                     EshotInit (ESHOT_NRG03, p->x - 10, p->y + 4, SPEED_SHOT1, p->s_angle, 0);
  132.                     EshotInit (ESHOT_NRG03, p->x + 4, p->y - 2, SPEED_SHOT1, p->s_angle, 0);
  133.                     p->s_angle += 12;
  134.                 } else {
  135.                     EshotInit (ESHOT_NRG03, p->x + 10, p->y + 4, SPEED_SHOT1, p->s_angle, 0);
  136.                     EshotInit (ESHOT_NRG03, p->x - 4, p->y - 2, SPEED_SHOT1, p->s_angle, 0);
  137.                     p->s_angle -= 12;
  138.                 }
  139.                 SoundSetSE (SE_ESHOT_M);    /* 敵ショット音(中) */
  140.             }
  141.         }
  142.         /* 4回復活以降の伸びる弾 */
  143.         if (p->arg >= 4) {
  144.             char a = psearch (p->x, p->y);
  145.             switch (p->s_work) {
  146.             case 20:
  147.                 if (p->cwork == WING_LEFT) {
  148.                     EshotInit (ESHOT_NRG24N, p->x - 10, p->y + 4, SPEED_SHOT2, a, 0);
  149.                     EshotInit (ESHOT_NRG24N, p->x + 4, p->y - 2, SPEED_SHOT2, a, 0);
  150.                     EshotInit (ESHOT_NRG24N, p->x - 10, p->y + 4, SPEED_SHOT2 + 4, a, 0);
  151.                     EshotInit (ESHOT_NRG24N, p->x + 4, p->y - 2, SPEED_SHOT2 + 4, a, 0);
  152.                     EshotInit (ESHOT_NRG24N, p->x - 10, p->y + 4, SPEED_SHOT2 + 8, a, 0);
  153.                     EshotInit (ESHOT_NRG24N, p->x + 4, p->y - 2, SPEED_SHOT2 + 8, a, 0);
  154.                     EshotInit (ESHOT_NRG24N, p->x - 10, p->y + 4, SPEED_SHOT2 + 12, a, 0);
  155.                     EshotInit (ESHOT_NRG24N, p->x + 4, p->y - 2, SPEED_SHOT2 + 12, a, 0);
  156.                 } else {
  157.                     EshotInit (ESHOT_NRG24N, p->x + 10, p->y + 4, SPEED_SHOT2, a, 0);
  158.                     EshotInit (ESHOT_NRG24N, p->x - 4, p->y - 2, SPEED_SHOT2, a, 0);
  159.                     EshotInit (ESHOT_NRG24N, p->x + 10, p->y + 4, SPEED_SHOT2 + 4, a, 0);
  160.                     EshotInit (ESHOT_NRG24N, p->x - 4, p->y - 2, SPEED_SHOT2 + 4, a, 0);
  161.                     EshotInit (ESHOT_NRG24N, p->x + 10, p->y + 4, SPEED_SHOT2 + 8, a, 0);
  162.                     EshotInit (ESHOT_NRG24N, p->x - 4, p->y - 2, SPEED_SHOT2 + 8, a, 0);
  163.                     EshotInit (ESHOT_NRG24N, p->x + 10, p->y + 4, SPEED_SHOT2 + 12, a, 0);
  164.                     EshotInit (ESHOT_NRG24N, p->x - 4, p->y - 2, SPEED_SHOT2 + 12, a, 0);
  165.                 }
  166.                 SoundSetSE (SE_EBOMB_M);
  167.                 break;
  168.             default:
  169.                 break;
  170.             }
  171.         }
  172.         if (p->s_work > 200) {
  173.             p->s_work = 0;
  174.             p->s_work3 = 0;
  175.         }
  176.         break;
  177.     }
  178.  
  179.  
  180.     /* 自機ショットに当たった時の処理 */
  181.     if (p->damage) {
  182.         SoundSetSE (SE_DAMAGE);
  183.         p->info = PALET_RED | PRIORITY_BOSS_PARTS_L;
  184.         p->damage_core = 0;
  185.         if ((p->hp -= p->damage) <= 0) {
  186.             /* 死んだ */
  187.             EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  188.             EffectInit (EFFECT_POINTS_RED, POINTS_4000, p->x, p->y);
  189.             SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  190.             if (disp_level == DISP_LEVEL_HIGH)
  191.                 EffectInit (EFFECT_HAHENMINI, 0, p->x, p->y);
  192.             p->child_death = !0;    /* 消去準備 */
  193.         }
  194.         p->damage = 0;
  195.         p->flash = TIMER_FLASH_DAMAGE;
  196.     } else {
  197.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < 100)) {
  198.             p->info = PALET_RED | PRIORITY_BOSS_PARTS_L;
  199.             if (p->flash > TIMER_FLASH_NORMAL)
  200.                 p->flash = 0;
  201.         } else {
  202.             p->info = p->parent->work4;
  203.         }
  204.     }
  205.     xobj_set_st (p);
  206.  
  207.  
  208.     return (0);
  209. }
  210.  
  211.  
  212.  
  213. static void EnemyTiniLBoss02W (ENEMY * p)
  214. {
  215. }
  216.